import { Device } from "./Device";
import { Message } from "./typings/index";

/**
 * 集线器: 可以连接多个设备,只是作为消息的转发操作，并非是一个设备
 * 多个集线器连接其实相当于一个大的，网口更多的集线器，所以这里使用单例模式来模拟
 */
export class Hub {
  private linkDevices: Array<Device> = [];
  static hub: Hub | null = null;
  private constructor() {}

  static initHub() {
    if (Hub.hub === null) {
      Hub.hub = new Hub();
    }
    return Hub.hub;
  }

  /**
   * 模拟电脑网线连接
   * @param device
   */
  link(device: Device | Hub) {
    if (device instanceof Hub) return;
    // 连接该电脑
    this.linkDevices.push(device);
  }

  sendMessage(message: Message): void {
    const list = this.linkDevices.filter((item) => {
      return item.mac !== message.source;
    });

    list.forEach((item) => {
      (item as Device).receiveMessage(message);
    });
  }
}
